package cevent.source.cloudcenter.template.util;/**
 * Created by Cevent on 2021/3/20.
 */

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;

/**
 * @author cevent
 * @description Freemarker生成器
 * static声明静态对象，可以在其他类直接调用class.method(param)
 * @date 2021/3/20 22:29
 */
public class FreemarkerUtil {
    static String PARENTDIR="cevent-source-cloudcenter";
    static String COMMON="template-generator";
    //1.定义模板路径，所有模板放在ftl
    static String ftlPath=PARENTDIR+"\\"+COMMON+"\\src\\main\\java\\cevent\\source\\cloudcenter\\template\\ftl\\";
    //公共属性
    static Template template;
    //2.读取模板：初始化版本，根据pom（外部传入参数ftl-freemarker模板名称）
    public static void initConfig(String ftlName) throws IOException{
        //Configuration在freemarker-》2.3.31被deprecated声明不赞成，这里适用，引用版本号恢复正常
        Configuration configuration=new Configuration(Configuration.VERSION_2_3_31);
        configuration.setDirectoryForTemplateLoading(new File(ftlPath));
        configuration.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_31));
        template=configuration.getTemplate(ftlName);
    }

    //3.生成文件方法（targetPathFileName生成目标文件名：[path+"className.*"]）
    public static void generator(String targetPathFileName , Map<String,Object> map) throws IOException, TemplateException {
        //调整参数（生成文件名[路径+类名]）：targetPath+"Test.java = targetPathFileName
        FileWriter fileWriter=new FileWriter(targetPathFileName);
        BufferedWriter bufferedWriter=new BufferedWriter(fileWriter);
        //放入\GeneratorApplication定义的变量
        //List<FieldUtil> fieldUtilList= DataBaseUtil.getColumnByTableName(tableName);
        //根据类信息，获取所有的set类型集合
        //  Set<String> typeSet=getJavaTypes(fieldUtilList);
        //  Map<String,Object> map=new HashMap<>();
        template.process(map,bufferedWriter);
        bufferedWriter.flush();
        fileWriter.close();
    }
}
